package com.aw.baselib.util

import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
import android.provider.Settings
import android.telephony.TelephonyManager
import android.text.TextUtils
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.io.RandomAccessFile
import java.util.UUID

/**
 * @author LiuShiKai
 * @version 1
 * @date 2018/8/21
 * @describe 获得设备相关信息的工具类
 */
object EquipmentInfoUtils {
    /**
     * 获取手机IMEI号
     *
     *
     * 需要动态权限: android.permission.READ_PHONE_STATE
     */
    fun getDeviceId(context: Context): String {
        var deviceId: String? = ""
        //        if(!TextUtils.isEmpty(SirunAppAplication.getInstance().getmDeviceToken())) {
//            deviceId = SirunAppAplication.getInstance().getmDeviceToken();
//        } else {
        deviceId = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (context.checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
                val telephonyManager =
                    context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
                telephonyManager.deviceId
            } else {
                getInstalltionId(context)
            }
        } else {
            getInstalltionId(context)
        }
        if (TextUtils.isEmpty(deviceId)) {
            deviceId = getAndroidId(context)
        }
        if (TextUtils.isEmpty(deviceId)) {
            deviceId = getInstalltionId(context)
        }
        if (TextUtils.isEmpty(deviceId) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            deviceId = Build.getSerial()
        }
        if (TextUtils.isEmpty(deviceId) || deviceId == null || deviceId == "null") {
            deviceId = "000000" + System.currentTimeMillis() + "DAYUN"
        }
        //        }
        return deviceId
    }

    /**
     * 获取AndroidID
     * 在设备首次启动时，系统会随机生成一个64位的数字，并把这个数字以16进制字符串的形式保存下来。
     * 不需要权限，平板设备通用。获取成功率也较高，缺点是设备恢复出厂设置会重置。
     * 另外就是某些厂商的低版本系统会有bug，返回的都是相同的AndroidId
     */
    fun getAndroidId(context: Context): String {
        return Settings.System.getString(context.contentResolver, Settings.System.ANDROID_ID)
    }

    /**
     * 获取设备的Installtion ID
     * 这种方式的原理是在程序安装后第一次运行时生成一个ID，该方式和设备唯一标识不一样，
     * 不同的应用程序会产生不同的ID，同一个程序重新安装也会不同。所以这不是设备的唯一ID，
     * 但是可以保证每个用户的ID是不同的。可以说是用来标识每一份应用程序的唯一ID（即Installtion ID），
     * 可以用来跟踪应用的安装数量等。
     *
     * @param context 上下文
     * @return Installtion ID
     */
    @Synchronized
    fun getInstalltionId(context: Context): String {
        val InstalltionID: String
        val installation = File(context.filesDir, "SignUtil")
        InstalltionID = try {
            if (!installation.exists()) {
                writeInstallationFile(installation)
            }
            readInstallationFile(installation)
        } catch (e: Exception) {
            throw RuntimeException(e)
        }
        return InstalltionID
    }

    @Throws(IOException::class)
    private fun readInstallationFile(installation: File): String {
        val f = RandomAccessFile(installation, "r")
        val bytes = ByteArray(f.length().toInt())
        f.readFully(bytes)
        f.close()
        return String(bytes)
    }

    @Throws(IOException::class)
    private fun writeInstallationFile(installation: File) {
        val out = FileOutputStream(installation)
        val id = UUID.randomUUID().toString()
        out.write(id.toByteArray())
        out.close()
    }
}